package com.ejd.service.impl;

import java.io.Serializable;

import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;

import com.ejd.hibernate.basedao.IBaseDao;
import com.ejd.hibernate.dao.support.Page;
import com.ejd.service.IOperateService;


/**
 * 增删改查公共服务接口
 */
public class OperateServiceImp<T,PK extends Serializable> implements IOperateService<T,PK> {

	// /////////////////////////////////////////////属性///////////////////////////////////////////
	@SuppressWarnings("unused")
	private Logger logger = Logger.getLogger(this.getClass());
	/**
	 * 通用DAO
	 */
	private IBaseDao<T,PK> genericDao;
	/**
	 * 每页显示记录的数目(默认值)
	 */
	private int pageSize = 10;
	// /////////////////////////////////////////////存取方法///////////////////////////////////////////
	public IBaseDao<T, PK> getGenericDao() {
		return this.genericDao;
	}

	public void setGenericDao(IBaseDao<T, PK> genericDao) {
		this.genericDao = genericDao;
	}

	// /////////////////////////////////////////////构造方法///////////////////////////////////////////
	public OperateServiceImp() {
	}

	// /////////////////////////////////////////////实体传递方法///////////////////////////////////////////
	
	/* (non-Javadoc)
	 * @see com.szairport.blc.service.IOperateManager#setEntityClass(java.lang.Class)
	 */
	public void setEntityClass(Class<T> entity) {
		this.genericDao.setEntityClass(entity);
		
	}

	/* (non-Javadoc)
	 * @see com.szairport.blc.service.IOperateManager#setPKClass(java.lang.Class)
	 */
	public void setPKClass(Class<PK> pk) {
		this.genericDao.setPKClass(pk);
	}
	

	/* (non-Javadoc)
	 * @see com.szairport.blc.service.IOperateManager#delete(java.lang.Object)
	 */
	public void delete(PK id) {
		this.genericDao.removeById(id);
	}

	/* (non-Javadoc)
	 * @see com.szairport.blc.service.IOperateManager#merge(java.lang.Object)
	 */
	public T merge(T detachedInstance) {
		return this.genericDao.merge(detachedInstance);
	}

	/* (non-Javadoc)
	 * @see com.szairport.blc.service.IOperateManager#saveOrUpdate(java.lang.Object)
	 */
	public void saveOrUpdate(T instance) {
		this.genericDao.saveOrUpdate(instance);
	}

	/* (non-Javadoc)
	 * @see com.szairport.blc.service.IOperateManager#findById(java.lang.Object)
	 */
	public T findById(PK id) {
		return this.genericDao.get(id);
	}

	/* (non-Javadoc)
	 * @see com.szairport.blc.service.IOperateManager#findByExample(java.lang.Object)
	 */
	public List<T> findByExample(T instance) {
		return this.genericDao.findByExample(instance);
	}

	/* (non-Javadoc)
	 * @see com.szairport.blc.service.IOperateManager#findBy(java.lang.String, java.lang.Object)
	 */
	public List<T> findBy(String propertyName, Object value){
		return this.genericDao.findBy(propertyName, value);
	}
	
	/* (non-Javadoc)
	 * @see com.szairport.blc.service.IOperateManager#findUniqueBy(java.lang.String, java.lang.Object)
	 */
	public T findUniqueBy(String propertyName, Object value){
		return this.genericDao.findUniqueBy(propertyName, value);
	}

	/* (non-Javadoc)
	 * @see com.szairport.blc.service.IOperateManager#ifExistByExample(com.szairport.blc.model.User)
	 */
	public  boolean ifExistBy(String propertyName, Object value) {
		T entity=this.findUniqueBy(propertyName, value);
		if(entity==null){
			return false; 
		}else{
			this.getGenericDao().evict(entity);
			return true;
		}
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	// /////////////////////////////////////////////方法///////////////////////////////////////////
	
	
	/**
	 * 分页查询函数，使用已设好查询条件与排序的<code>Criteria</code>.
	 * 
	 * @param pageNo
	 *            页号,从1开始.
	 * @return 含总记录数和当前页数据的Page对象.
	 */
	public Page<T, PK> pagedQuery(Criteria criteria, int pageNo, int pageSize) {

		return genericDao.pagedQuery(criteria, pageNo, pageSize);
	}
	/**
	 * 分页查询函数，根据entityClass和查询条件参数创建默认的<code>Criteria</code>.
	 * 
	 * @param pageNo
	 *            页号,从1开始.
	 * @return 含总记录数和当前页数据的Page对象.
	 */
	public Page<T, PK> pagedQuery(int pageNo, int pageSize,
			Criterion... criterions) {

		return genericDao.pagedQuery(pageNo, pageSize, criterions);
	}
	/* (non-Javadoc)
	 * @see com.szairport.blc.service.IQueryManager#pagedQuery(int, java.util.List, java.util.List)
	 */
	public Page<T, PK> pagedQuery(int pageNo, List<Criterion> filterList,
			List<Order> orderList) {
		return this.genericDao.pagedQuery(pageNo, this.pageSize, filterList,
				orderList);
	}
	/**
	 * 分页查询函数，根据entityClass和查询条件参数,排序参数创建默认的<code>Criteria</code>.
	 * 
	 * @param pageNo
	 *            页号,从1开始.
	 * @return 含总记录数和当前页数据的Page对象.
	 */
	public Page<T, PK> pagedQuery(int pageNo, int pageSize, String orderBy,
			boolean isAsc, Criterion... criterions) {

		return genericDao.pagedQuery(pageNo, pageSize, orderBy, isAsc, criterions);
	}
	/**
	 * 分页查询函数，使用hql.
	 * 
	 * @param pageNo
	 *            页号,从1开始.
	 */
	public Page<T, PK> pagedQuery(String hql, int pageNo, int pageSize,
			Object... values) {

		return genericDao.pagedQuery(hql, pageNo, pageSize, values);
	}

	/**
	 * {@inheritDoc}
	 */
	public boolean exists(PK id) {
	    return genericDao.exists(id);
	}

	/**
	 * {@inheritDoc}
	 */
	public T get(PK id) {
	    return genericDao.get(id);
	}

	/**
	 * {@inheritDoc}
	 */
	public List<T> getAll() {
	    return genericDao.getAll();
	}
	/**
	 * 获取全部对象,带排序字段与升降序参数.
	 */
	public List<T> getAll(String orderBy, boolean isAsc) {

		return genericDao.getAll(orderBy, isAsc);
	}
	public Criteria createCriteria(Criterion... criterions) {
		return genericDao.createCriteria(criterions);
	}

	/**
	 * 创建Criteria对象，带排序字段与升降序字段.
	 */
	public Criteria createCriteria(String orderBy, boolean isAsc, Criterion... criterions) {
		return genericDao.createCriteria(orderBy, isAsc, criterions);
	}

	

	/**
	 * {@inheritDoc}
	 */
	public void remove(PK id) {
		T entity=genericDao.get(id);
		genericDao.lastUpdatedMessage(entity);
	    genericDao.removeById(id);
	}
	/**
	 * 删除对象.
	 */
	public void removeEntity(T entity) {
		genericDao.lastUpdatedMessage(entity);
		genericDao.remove(entity);
	}

	/**
	 * 根据ID删除对象.
	 */
	public void removeById(PK id) {
		T entity=genericDao.get(id);
		genericDao.lastUpdatedMessage(entity);
		genericDao.remove(entity);
	}

	/**
	 * {@inheritDoc}
	 */
	public T save(T object) {
	    return genericDao.save(object);
	}
	public Page<T, PK> dataQuery(String hql, int start, int pageSize,
			Object... values) {
		return genericDao.dataQuery(hql, start, pageSize, values);
	}
	/**
	 * 根据hql查询,直接使用HibernateTemplate的find函数.
	 * 
	 * @param values
	 *            可变参数
	 */
	@SuppressWarnings("unchecked")
	public List<T> find(String hql, Object... values) {

		return genericDao.find(hql, values);
	}
	/**
	 * 根据属性名和属性值查询对象,带排序参数.
	 */
	public List<T> findBy(String propertyName, Object value, String orderBy,
			boolean isAsc) {

		return genericDao.findBy(propertyName, value, orderBy, isAsc);
	}
	/**
	 * 执行一些必须的sql语句把内存中的对象同步到jdbc的链接中
	 */
	public void flush() {

		genericDao.flush();
	}

}
